<?php
/**
 * Webphp.php
 * Created by PhpStorm.
 * User: 江小波
 * Date: 2019/3/6
 * Time: 16:11
 */
namespace webapp\lib;

use webapp\lib\util\Hump;

class Webphp {
    /**
     * 应用程序初始化
     * @access public
     * @return void
     */
    static public function run() {
        // 注册AUTOLOAD方法
        spl_autoload_register('\webapp\lib\Webphp::autoload');
        // 设定错误和异常处理
        register_shutdown_function('\webapp\lib\Webphp::appShutdown');
        set_error_handler(ERROR_CLASS.'::appError');
        set_exception_handler(ERROR_CLASS.'::appException');
    }

    /**
     * 类库自动加载
     * @param string $class 对象类名
     * @return void
     */
    public static function autoload($class) {
        /**
         * \app::a(); => $class=app
         * \app\index::a(); => $class=app\index
         */
        $names = explode("\\",$class);

        if($names[0] === 'webapp'){
            $drivePath = WEBPHP_PATH;
        }else if($names[0] === 'app'){
            $drivePath = APP_PATH;
        }

        $names[0] = str_replace(["/","\\"],DS,$drivePath);

        $filename = implode(DS,$names).EXT;

        include $filename;
    }
    // 程序结束进行回调方法
    public static function appShutdown() {
        if ($e = error_get_last()) {
            switch($e['type']){
                case E_ERROR:
                case E_PARSE:
                case E_CORE_ERROR:
                case E_COMPILE_ERROR:
                case E_USER_ERROR:
                    ob_end_clean();
                    $errorClass = ERROR_CLASS;
                    if(class_exists($errorClass)){
                        $errorClass::fatalError($e);
                    }
                    break;
            }
        }
        // app end
        // 正常结束程序
        exit;
    }
    /**
     * 自定义错误处理
     * @access public
     * @param int $errno 错误类型
     * @param string $errstr 错误信息
     * @param string $errfile 错误文件
     * @param int $errline 错误行数
     * @return void
     */
//    public static function appError($errno, $errstr, $errfile, $errline) {}
    /**
     * 自定义异常处理
     * @access public
     * @param mixed $e 异常对象
     */
//    public static function appException($e) {}
    /**
     * 页面指向
     * @param string $class 对象类名
     * @return void
     */
    public static function to($class) {
        $actions = explode("\\",str_replace(["/","\\"],"\\",$class));
        $classIndex = count($actions) - 1;
        $actions[$classIndex] = Hump::camel($actions[$classIndex]);
        $page = "\\app".implode("\\",$actions);
        // 必须支持 PAGE 类才能正常的产品类
        if(get_parent_class($page) !== "webapp\\lib\\Page"){
            header("HTTP/1.1 404 Not Found");
            header("Status: 404 Not Found");
            exit;
        }
        $res = $page::index();
        if(is_object($res) && method_exists($res,'send')){
            $res->send();
        }else if(is_string($res)){
            exit($res);
        }
    }
}